#ifndef MY_SHELL_WORD_H
#define MY_SHELL_WORD_H

#include <unordered_set>
#include <string>

#include "MyShellNamespace.h"

MY_SHELL_NAMESPACE_BEGIN
// 关键字
extern std::unordered_set<std::string> keywords;

// mysh中可能使用的单字符
extern std::unordered_set<char> single_characters;

// 单词类型
enum WORD_TYPE {
    ILLEGAL_WORD, 
    FUNCTION,
    DECLARE,
    FOR,
    IN,
    TO,
    IF,
    ELIF,
    ELSE,
    CALL,
    RETURN,
    RUN,
    INPUT, 
    OUTPUT, 
    INT,
    STRING,
    ARRAY,
    BOOL,
    VOID,
    TRUE,
    FALSE,
    SEMICOLON,
    LEFT_PARENTHESES,
    RIGHT_PARENTHESES,
    LEFT_SQUARE_BRACKETS,
    RIGHT_SQUARE_BRACKETS,
    LEFT_BRACE,
    RIGHT_BRACE,
    ASSIGN,
    // ADD,
    // SUB,
    // MUL,
    DIV,
    GTR,
    LES,
    // GEQ,
    // LEQ,
    // EQU,
    COMMA,
    COLON, 
    EXPLANATORY_NOTE,
    IDENTIFIER,
    INTEGER,
    ARRAY_VALUE,
    STRING_VALUE,
    BOOL_VALUE,
    COMMAND
};

// 单词
class Word
{
public:
    // 单词名
    std::string name;
    // 单词类型
    enum mysh::WORD_TYPE word_type;
public:
    // 构造函数
    Word(const std::string& name = std::string(), enum mysh::WORD_TYPE word_type = mysh::WORD_TYPE::ILLEGAL_WORD);
public:
    // 用于判断一些信息的辅助函数
    // 判断是否为空单词
    bool ifEmpty();
};
MY_SHELL_NAMESPACE_END

#endif // ! MY_SHELL_WORD_H